package com.kexio.enterprise.integration.message;

import com.kexio.enterprise.integration.message.domain.Message;
import com.kexio.enterprise.integration.message.enums.MessageStatus;
import com.kexio.enterprise.integration.message.history.MessageHistory;
import com.kexio.enterprise.integration.message.query.MessageQueryCriteria;
import com.kexio.enterprise.integration.message.result.MessageSendResult;
import com.kexio.enterprise.integration.message.schedule.MessageScheduleResult;
import com.kexio.enterprise.integration.message.statistics.MessageStatistics;
import com.kexio.enterprise.integration.message.template.MessageTemplate;
import com.kexio.enterprise.integration.message.template.TemplateMessage;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息服务接口
 * 
 * 提供统一的消息发送抽象，支持邮件、短信、推送等多种消息类型
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface MessageService {

    /**
     * 发送消息
     * 
     * @param message 消息内容
     * @return 发送结果
     */
    MessageSendResult sendMessage(Message message);

    /**
     * 批量发送消息
     * 
     * @param messages 消息列表
     * @return 发送结果列表
     */
    List<MessageSendResult> batchSendMessages(List<Message> messages);

    /**
     * 异步发送消息
     * 
     * @param message 消息内容
     */
    void sendMessageAsync(Message message);

    /**
     * 批量异步发送消息
     * 
     * @param messages 消息列表
     */
    void batchSendMessagesAsync(List<Message> messages);

    /**
     * 发送模板消息
     * 
     * @param templateMessage 模板消息
     * @return 发送结果
     */
    MessageSendResult sendTemplateMessage(TemplateMessage templateMessage);

    /**
     * 预定时发送消息
     * 
     * @param message   消息内容
     * @param sendTime  发送时间
     * @return 调度结果
     */
    MessageScheduleResult scheduleMessage(Message message, LocalDateTime sendTime);

    /**
     * 取消预定时消息
     * 
     * @param scheduleId 调度ID
     * @return 是否成功
     */
    boolean cancelScheduledMessage(String scheduleId);

    /**
     * 获取消息发送状态
     * 
     * @param messageId 消息ID
     * @return 消息状态
     */
    MessageStatus getMessageStatus(String messageId);

    /**
     * 查询消息发送历史
     * 
     * @param criteria 查询条件
     * @return 消息历史列表
     */
    List<MessageHistory> queryMessageHistory(MessageQueryCriteria criteria);

    /**
     * 获取消息统计信息
     * 
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 统计信息
     */
    MessageStatistics getMessageStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 注册消息模板
     * 
     * @param template 消息模板
     */
    void registerTemplate(MessageTemplate template);

    /**
     * 更新消息模板
     * 
     * @param template 消息模板
     */
    void updateTemplate(MessageTemplate template);

    /**
     * 删除消息模板
     * 
     * @param templateId 模板ID
     */
    void deleteTemplate(String templateId);

    /**
     * 获取消息模板
     * 
     * @param templateId 模板ID
     * @return 消息模板
     */
    MessageTemplate getTemplate(String templateId);

    /**
     * 获取所有消息模板
     * 
     * @return 模板列表
     */
    List<MessageTemplate> getAllTemplates();

    /**
     * 重试失败的消息
     * 
     * @param messageId 消息ID
     * @return 重试结果
     */
    MessageSendResult retryMessage(String messageId);

    /**
     * 批量重试失败的消息
     * 
     * @param messageIds 消息ID列表
     * @return 重试结果列表
     */
    List<MessageSendResult> batchRetryMessages(List<String> messageIds);

    /**
     * 清理消息历史
     * 
     * @param beforeTime 清理此时间之前的历史
     * @return 清理的记录数
     */
    int cleanupMessageHistory(LocalDateTime beforeTime);
}
